package com.mashibing.api.filter.impl;

/**
 * @ClassName:ApiKeyCheckFilter
 * @author:[开发者名称]
 * @Description:[类的功能描述]
 * @Date:2025/9/13/19:32
 * @Version:1.0
 */

import com.mashibing.api.client.BeaconCacheClient;
import com.mashibing.api.filter.CheckFilter;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.ApiException;
import com.mashibing.common.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 校验客户的ip地址是否是白名单
 */
@Component("ip")
@Slf4j
public class IPCheckFilter implements CheckFilter {

    @Autowired
    private BeaconCacheClient cacheClient;

    private final String IP_ADDRESS = "ipAddress";


    @Override
    public void check(StandardSubmit submit) {
        log.info("【接口模块-校验ip】   校验ing…………");
        //1. 根据CacheClient根据客户的apikey以及ipAddress去查询客户的IP白名单
        String ips =  cacheClient.hgetString(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), IP_ADDRESS);


        /**
         * 客户端设置的ip白名单，通过查询缓存获取  private List<String> ip;
         * RealIP客户端请求在真实ip
         * 需要转换成List集合 排查null 和List size==0 或者真实ip在白名单内 返回【接口模块-校验ip】  客户端请求IP合法！
           将ip白名单封装到 StandardSubmit 对象中去
         */
        List<String> ipsList = convertStringToList(ips);

        //封装到对象中 方便后续校验链 校验
        submit.setIp(ipsList);

        //2. 如果IP白名单为null，直接放行
        if(ipsList.isEmpty() || ipsList.contains(submit.getRealIP())){
            log.info("【接口模块-校验ip】  客户端请求IP合法！");
            return;
        }

        //3. IP白名单不为空，并且客户端请求不在IP报名单内
        log.info("【接口模块-校验ip】  请求的ip不在白名单内");
        throw new ApiException(ExceptionEnums.IP_NOT_WHITE);
    }

    /**
     * 将string ips白名单 转换为List<String>集合 如果ips==null或=="" 返回一个size为0的集合
     * @param ips
     * @return
     */
    public static List<String> convertStringToList(String ips) {
        // 处理 null 情况  处理空字符串情况
        if (ips == null||ips.trim().isEmpty()) {
            return Collections.emptyList();
        }

        // 分割字符串并处理每个元素
        return Arrays.stream(ips.split(","))
                .map(String::trim)          // 去除每个元素两端的空格
                .filter(s -> !s.isEmpty())  // 过滤空字符串
                .collect(Collectors.toList());
    }

}
